
using EYDIngenieria.ERP.ObjetosDeNegocio.Dominio;
using EYDIngenieria.ERP.ObjetosDeNegocio.Repositorio;

namespace EYDIngenieria.ERP.Aplicacion.Gestion
{
    public class GestionDetalleOrdenDeTrabajoAuxiliar
    {
        private readonly RepositorioDetalleOrdenDeTrabajoAuxiliar repositorio = new RepositorioDetalleOrdenDeTrabajoAuxiliar();
        private readonly GestionInventario gestionInventario = new GestionInventario();
        private readonly RepositorioDetalleDespachoMaterialesOTAuxiliar repositorioDetalleDespacho = new RepositorioDetalleDespachoMaterialesOTAuxiliar();
        private readonly RepositorioInventario repositorioInventario = new RepositorioInventario();
        private double despachado;


        public void Despachar(DetalleOrdenDeTrabajoAuxiliar dot,  double cantidad)
        {
            dot.Saldo = dot.Saldo - cantidad;
            dot.Despachado = dot.Despachado + cantidad;
            repositorio.Modificar(dot);
            double monto = gestionInventario.Quitar(dot,cantidad,0);
            dot.Monto = dot.Monto + monto;
            repositorio.Modificar(dot);
        }

        public void DespacharSinOT(DetalleOrdenDeTrabajoAuxiliar dot, double cantidad)
        {
            dot.Saldo = dot.Saldo - cantidad;
            dot.Despachado = dot.Despachado + cantidad;
            repositorio.Modificar(dot);
            double monto = gestionInventario.Quitar(dot, cantidad, 0);
            dot.Monto = dot.Monto + monto;
            repositorio.Modificar(dot);
        }

        public DetalleOrdenDeTrabajoAuxiliar Obtener(int id)
        {
            return repositorio.Obtener(id);

        }

        public void Guardar(DetalleOrdenDeTrabajoAuxiliar dot)
        {
            repositorio.Agregar(dot);
            Despachar(dot, dot.Cantidad);

        }

        public void Modificar(DetalleOrdenDeTrabajoAuxiliar dot)
        {
            repositorio.Modificar(dot);
            
        }

        public void Devolver(DetalleOrdenDeTrabajoAuxiliar dot, double cantidad)
        {
            DetalleDespachoMaterialesOTAuxiliar[] detallesDespacho= repositorioDetalleDespacho.Buscar(dot);
            DetalleDespachoMaterialesOTAuxiliar detalleDespachoMaterialesOt = new DetalleDespachoMaterialesOTAuxiliar();

            Inventario inventario = repositorioInventario.Buscar(dot.Producto)[0];
            inventario.CantidadEgreso = inventario.CantidadEgreso - cantidad;
            inventario.MontoEgreso = inventario.MontoEgreso - (inventario.ValorUnitario * cantidad);
            inventario.Saldo = inventario.Saldo + cantidad;
            repositorioInventario.Modificar(inventario);

            dot.Saldo = dot.Saldo + cantidad;
            dot.Despachado = dot.Despachado - cantidad;
            dot.Monto = dot.Monto - (inventario.ValorUnitario * cantidad);
            repositorio.Modificar(dot);
            
            foreach (DetalleDespachoMaterialesOTAuxiliar detalleDespacho in detallesDespacho)
            {
                if (detalleDespacho.DetalleOT.Producto.Id.Equals(dot.Producto.Id))
                    detalleDespachoMaterialesOt = detalleDespacho;
                if (detalleDespachoMaterialesOt.Id == 0)
                    return;

                if (cantidad >= detalleDespacho.Cantidad)
                {
                    cantidad = cantidad - detalleDespacho.Cantidad;
                    detalleDespacho.Cantidad = 0;    
                }
                else
                {
                    detalleDespacho.Cantidad = detalleDespacho.Cantidad - cantidad;
                }

                if (detalleDespacho.Cantidad == 0)
                    repositorioDetalleDespacho.Eliminar(detalleDespacho);
                else
                    repositorioDetalleDespacho.Modificar(detalleDespacho);
            }
        }
    }
}


